Exploring State - LayerX Web Frontend Night
https://gyazo.com/ae6fe558aa57da389c021033aabcfe2d
Exploring State - LayerX Web Frontend Night - connpass
状態と共に暮らす:ステートフルへの挑戦
ypresto
株式会社LayerX
状態と共に暮らす:ステートフルへの挑戦 - Speaker Deck
状態が中心にくる
ロジックと状態が密結合
テスラーの複雑性保存則
D.A.ノーマン
本質的な複雑さは減らせない、移動しかできない
どこに移動するか?
本質的ではない複雑さが少ない場所
品質担保が容易な場所
ステートフルの複雑性
状態から別の状態を計算(変換ロジック)
https://gyazo.com/fef0b0c57e30aa908c1a31a9ba48ba40
$ VirtualDOM=f(props,hooks1,hooks2,...)
リアクティブは状態感を簡潔に扱える
useEffectとsetStateの組み合わせは99%アンチパターン
イベントに応じて状態を変更する(イベントハンドラー)
onChange={e=>setState(e.target.event)}
便利
ただ便利になればなるほど複雑化していく
解決策:Reducerで純粋関数で強制的に表現する
https://gyazo.com/76859835a918c52127d6d56d3e587662
フォームへ変更内容を計算して返す純粋関数
現在の状態や1つ前のtransform()が返したdiffを引数で受け取る
設定はtransformを作る時に引数として受ける
分解でき、テストでき、いくつでも組み合わせられる
Reactに依存しない状態管理のアプローチ
yuta-ike
エムスリー株式会社
複雑さは何に起因するか
データ構造が巨大
更新ロジックが複雑
などなど
ざっくり分類する
非同期のデータ取得
ビジネスロジックに起因する複雑さ
パフォーマンス
ロジックが複雑
UI = f(State)
stateが必ず決まればUIも決まる(一意)
Reactには意識してないがViewModelがあるのではという仮説
ViewModelをテスト対象にする
純粋なJavaScriptでテストできる
ユニットテストでUIテストができる
カスタムフックだとReactに依存してしまう
Stateをそのまま返していないから外部からアクセスできない
内部で呼ばれた関数自体は純粋ではない
更新ロジック
今のViewModelから新しいViewModelへと遷移するようにする
useReducer – React
参照ロジック
読みやすいデータで欲しい
バックエンドのデータベース正規化モデルとAPIレスポンスのデータ型が一致しないケースと酷似
useMemoに書かれた関数を外に出せばOK
巨大なJSONで管理している場合
状態が多くの箇所で変更されることがある
ライブラリで解決できる
Zustand, Jotai
複雑なフォームの jotai 設計
複雑なフォームの jotai 設計 / Designing jotai(state) for Complex Forms #layerx_frontend - Speaker Deck
izumin
株式会社LayerX
複雑なフォームと複雑な状態管理にどう向き合うか / #newt_techtalk vol. 15 - Speaker Deck
例:外貨対応の金額入力
通貨指定して金額入力する
日本円換算の金額で設定された上限バリデーションがある
Jotai: なるべく状態ではなく値に扱うようにする
Stateは書き込みが可能
書き込みを正しく扱う
状態は減らしたいようにする
Derived Value
バリデーションの対象は直接な入力値とは限らない
ドメインロジックを分離する
Derived AtomはPromiseも返せる(そうじゃないこともできる)
async sometimesパターン
Jotai v2を使いこなすために実は必須級な“async sometimes”パターンの解説
ユーザーが直接編集する状態と別の値から決まる値は分ける
その値がどこから来たのかを書き込む場所を減らすようにする
ユーザーからの入力を適切に書き込むようにする
単なる状態とで別に管理するようにする
更新系と状態
uhyo
React 19ではuseActionState、useOptimisticが追加された
GitHub - uhyo/sample-update-state